{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import os,random,shutil\n",
    "np.random.seed(7)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1, 准备数据集\n",
    "#1，指定一些超参数：\n",
    "train_data_dir='E:\\PyProjects\\DataSet\\DogsVsCats_Tiny/train'\n",
    "val_data_dir='E:\\PyProjects\\DataSet\\DogsVsCats_Tiny/test' # keras中将测试集称为validation set\n",
    "train_samples_num=2000 # train set中全部照片数\n",
    "val_samples_num=800\n",
    "IMG_W,IMG_H,IMG_CH=150,150,3 # 单张图片的大小\n",
    "batch_size=16 # 不能是32，因为2000/32不能整除，后面会有影响。\n",
    "epochs=20  # 用比较少的epochs数目做演示，节约训练时间"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 2000 images belonging to 2 classes.\n"
     ]
    }
   ],
   "source": [
    "# 2，准备图片数据流\n",
    "from keras.preprocessing.image import ImageDataGenerator\n",
    "train_datagen = ImageDataGenerator( # 单张图片的处理方式，train时一般都会进行图片增强\n",
    "        rescale=1. / 255, # 图片像素值为0-255，此处都乘以1/255，调整到0-1之间\n",
    "        shear_range=0.2, # 斜切\n",
    "        zoom_range=0.2, # 放大缩小范围\n",
    "        horizontal_flip=True) # 水平翻转\n",
    "\n",
    "train_generator = train_datagen.flow_from_directory(# 从文件夹中产生数据流\n",
    "    train_data_dir, # 训练集图片的文件夹\n",
    "    target_size=(IMG_W, IMG_H), # 调整后每张图片的大小\n",
    "    batch_size=batch_size,\n",
    "    class_mode='binary') # 此处是二分类问题，故而mode是binary"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 800 images belonging to 2 classes.\n"
     ]
    }
   ],
   "source": [
    "# 3，同样的方式准备测试集\n",
    "val_datagen = ImageDataGenerator(rescale=1. / 255) # 只需要和trainset同样的scale即可，不需增强\n",
    "val_generator = val_datagen.flow_from_directory(\n",
    "        val_data_dir,\n",
    "        target_size=(IMG_W, IMG_H),\n",
    "        batch_size=batch_size,\n",
    "        class_mode='binary')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 4，构建模型\n",
    "from keras.preprocessing.image import ImageDataGenerator\n",
    "from keras.models import Sequential\n",
    "from keras.layers import Dropout, Flatten, Dense\n",
    "from keras import applications\n",
    "from keras import optimizers\n",
    "from keras.models import Model\n",
    "def build_model():\n",
    "    base_model = applications.VGG16(weights='imagenet', include_top=False,input_shape=(IMG_W, IMG_H,IMG_CH))\n",
    "    # 此处我们只需要卷积层不需要全连接层，故而inclue_top=False,一定要设置input_shape，否则后面会报错\n",
    "    # 这一步使用applications模块自带的VGG16函数直接加载了模型和参数，作为我们自己模型的“身子”\n",
    "    \n",
    "    # 下面定义我们自己的分类器，作为我们自己模型的“头”\n",
    "    top_model = Sequential()\n",
    "    top_model.add(Flatten(input_shape=base_model.output_shape[1:])) # 如果没有设置input_shape,这个地方报错，显示output_shape有很多None\n",
    "    top_model.add(Dense(256, activation='relu'))\n",
    "    top_model.add(Dropout(0.5))\n",
    "    top_model.add(Dense(1, activation='sigmoid')) # 二分类问题\n",
    "    \n",
    "    top_model.load_weights('E:\\PyProjects\\DataSet\\FireAI\\DeepLearning\\FireAI006/top_FC_model') \n",
    "    # 上面定义了模型结构，此处要把训练好的参数加载进来，\n",
    "    \n",
    "    my_model = Model(inputs=base_model.input, outputs=top_model(base_model.output)) # 将“身子”和“头”组装到一起\n",
    "    # my_model就是我们组装好的完整的模型，也已经加载了各自的weights\n",
    "    \n",
    "    # 普通的模型需要对所有层的weights进行训练调整，但是此处我们只调整VGG16的后面几个卷积层，所以前面的卷积层要冻结起来\n",
    "    for layer in my_model.layers[:25]: # 25层之前都是不需训练的\n",
    "        layer.trainable = False\n",
    "        \n",
    "    # 模型的配置\n",
    "    my_model.compile(loss='binary_crossentropy',\n",
    "                  optimizer=optimizers.SGD(lr=1e-4, momentum=0.9), # 使用一个非常小的lr来微调\n",
    "                  metrics=['accuracy'])\n",
    "    return my_model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "start to fine-tune my model\n",
      "Epoch 1/20\n",
      "125/125 [==============================] - 614s 5s/step - loss: 0.3368 - acc: 0.9190 - val_loss: 0.6057 - val_acc: 0.8825\n",
      "Epoch 2/20\n",
      "125/125 [==============================] - 642s 5s/step - loss: 0.3294 - acc: 0.9175 - val_loss: 0.6057 - val_acc: 0.8825\n",
      "Epoch 3/20\n",
      "125/125 [==============================] - 646s 5s/step - loss: 0.3214 - acc: 0.9210 - val_loss: 0.6057 - val_acc: 0.8825\n",
      "Epoch 4/20\n",
      "125/125 [==============================] - 654s 5s/step - loss: 0.3324 - acc: 0.9130 - val_loss: 0.6057 - val_acc: 0.8825\n",
      "Epoch 5/20\n",
      "125/125 [==============================] - 639s 5s/step - loss: 0.3013 - acc: 0.9170 - val_loss: 0.6057 - val_acc: 0.8825\n",
      "Epoch 6/20\n",
      "125/125 [==============================] - 633s 5s/step - loss: 0.3490 - acc: 0.9140 - val_loss: 0.6057 - val_acc: 0.8825\n",
      "Epoch 7/20\n",
      "125/125 [==============================] - 618s 5s/step - loss: 0.3173 - acc: 0.9165 - val_loss: 0.6057 - val_acc: 0.8825\n",
      "Epoch 8/20\n",
      "125/125 [==============================] - 610s 5s/step - loss: 0.3006 - acc: 0.9165 - val_loss: 0.6057 - val_acc: 0.8825\n",
      "Epoch 9/20\n",
      "125/125 [==============================] - 612s 5s/step - loss: 0.3201 - acc: 0.9160 - val_loss: 0.6057 - val_acc: 0.8825\n",
      "Epoch 10/20\n",
      "125/125 [==============================] - 613s 5s/step - loss: 0.3075 - acc: 0.9155 - val_loss: 0.6057 - val_acc: 0.8825\n",
      "Epoch 11/20\n",
      "125/125 [==============================] - 612s 5s/step - loss: 0.3680 - acc: 0.9210 - val_loss: 0.6057 - val_acc: 0.8825\n",
      "Epoch 12/20\n",
      "125/125 [==============================] - 612s 5s/step - loss: 0.2877 - acc: 0.9250 - val_loss: 0.6057 - val_acc: 0.8825\n",
      "Epoch 13/20\n",
      "125/125 [==============================] - 612s 5s/step - loss: 0.2760 - acc: 0.9295 - val_loss: 0.6057 - val_acc: 0.8825\n",
      "Epoch 14/20\n",
      "125/125 [==============================] - 610s 5s/step - loss: 0.3218 - acc: 0.9185 - val_loss: 0.6057 - val_acc: 0.8825\n",
      "Epoch 15/20\n",
      "125/125 [==============================] - 611s 5s/step - loss: 0.3274 - acc: 0.9165 - val_loss: 0.6057 - val_acc: 0.8825\n",
      "Epoch 16/20\n",
      "125/125 [==============================] - 612s 5s/step - loss: 0.3147 - acc: 0.9215 - val_loss: 0.6057 - val_acc: 0.8825\n",
      "Epoch 17/20\n",
      "125/125 [==============================] - 609s 5s/step - loss: 0.3448 - acc: 0.9130 - val_loss: 0.6057 - val_acc: 0.8825\n",
      "Epoch 18/20\n",
      "125/125 [==============================] - 608s 5s/step - loss: 0.3287 - acc: 0.9140 - val_loss: 0.6057 - val_acc: 0.8825\n",
      "Epoch 19/20\n",
      "125/125 [==============================] - 608s 5s/step - loss: 0.3169 - acc: 0.9200 - val_loss: 0.6057 - val_acc: 0.8825\n",
      "Epoch 20/20\n",
      "125/125 [==============================] - 607s 5s/step - loss: 0.3029 - acc: 0.9210 - val_loss: 0.6057 - val_acc: 0.8825\n"
     ]
    }
   ],
   "source": [
    "# 开始用train set来微调模型的参数\n",
    "print('start to fine-tune my model')\n",
    "my_model=build_model()\n",
    "history_ft = my_model.fit_generator(\n",
    "        train_generator,\n",
    "        steps_per_epoch=train_samples_num // batch_size,\n",
    "        epochs=epochs,\n",
    "        validation_data=val_generator,\n",
    "        validation_steps=val_samples_num // batch_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 画图，将训练时的acc和loss都绘制到图上\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "def plot_training(history):\n",
    "    plt.figure(12)\n",
    "    \n",
    "    plt.subplot(121)\n",
    "    train_acc = history.history['acc']\n",
    "    val_acc = history.history['val_acc']\n",
    "    epochs = range(len(train_acc))\n",
    "    plt.plot(epochs, train_acc, 'b',label='train_acc')\n",
    "    plt.plot(epochs, val_acc, 'r',label='test_acc')\n",
    "    plt.title('Train and Test accuracy')\n",
    "    plt.legend()\n",
    "    \n",
    "    plt.subplot(122)\n",
    "    train_loss = history.history['loss']\n",
    "    val_loss = history.history['val_loss']\n",
    "    epochs = range(len(train_loss))\n",
    "    plt.plot(epochs, train_loss, 'b',label='train_loss')\n",
    "    plt.plot(epochs, val_loss, 'r',label='test_loss')\n",
    "    plt.title('Train and Test loss')\n",
    "    plt.legend()\n",
    " \n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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Qi5RSgNjQy5RgKzQivhc6AqMFJFsYB8wWFULPTnhFF9SqU0XBlcCTkJ5+umnky3CIahqJpCZI+2uXPKeHvb7dSB/I3GnxJNqbbqg+HCQ4zhOGuNKwHEcJ41xJeA4jpPGuBJwIlJYt7sATzzxBL/88kuMJXIcJx64EnAi4krAKWnEu003bNiQH3/8sVD1JxNXAk5Ewt3u3nrrrTz88MN07NiRNm3acPfddwPw888/c95559G2bVtatWrFxIkTeeqpp9iwYQNnnHEGZ5xxRq71X3/99WRkZNCyZcsD9QHMmzePk08+mbZt29KpUyd27NjBvn37GDZsGK1bt6ZNmzb87W9/i/v5OyUPf7GJjJuIFgeS4ID9wQcf5Msvv2ThwoW89957TJ48mc8++wxVpXfv3nz44Yds2rSJunXr8tZbbwHmf6VatWo89thjzJ49+4CXz0iMGjWK6tWrs2/fPrp3787ixYtp1qwZl156KRMnTqRjx45s376dihUrMmbMGNasWcOCBQsoU6ZMUXwFOalAkgIKhL/YnH322dSuXZtJkyaxZ88e+vTpw7333svPP//MJZdcwrp169i3bx933nknP/zww4EXm5o1azJ79ux8xXnssccYO9ZCrQ8cOJBbbrklYt2XXnppxJgCicSVgJMv7733Hu+99x7t27cHYOfOnaxYsYLTTjuNYcOGcdttt3H++edz2mnR+1CbNGkSY8aMITs7m++//56lS5ciItSpU4eOHTsCcMQRRwAwY8YMBg8eTJky1lwL6zraSW/i/WITYv78+bz44ovMnTsXVaVz585069aN1atXH1Z3KKbAV199hYgkJTSrK4HiQJIdsKsqI0aM4Lrrrjts3/z588nMzGTEiBGcc8453HVXxHVWh7BmzRoeeeQR5s2bx1FHHUX//v0PONGK5CI6hq6jnVQgBQIKxOPFJsRHH31Enz59Driqvuiii/jvf/9Ljx49Dqs7Ozs7YkyBROJzAk5Ewt3unnvuuYwdO5adO82P2vr169m4cSMbNmygUqVKXHXVVQwbNozPP//8sLKR2L59O5UrV6ZatWr88MMPvP3224C53N2wYQPz5s0DzL10dnY255xzDs8+++wB3+0+HOQUldCLzcKFC1m4cCErV65kwIABNGnShPnz59O6dWtGjBjByJEjC1V3JCLVnVtMgUTiPQEnIuFud3v2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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_training(history_ft)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 很明显，这个训练有问题，在测试集上的表现一直没有变化，本来我想删除上面的结果，重新来做一遍，但考虑也许以后也会有人碰到同样的情况，故而保留。\n",
    "# 通过print(len(my_model.layers))可以发现my_model整个的层数是20层，上面我们设置25层都不是trainable，所以把整个网络层都freeze掉，\n",
    "# 这样就不能更改其中的weights,所以每次在test set上的表现都一样，都是用最原始的weights来测试。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 上面的build_model2中间的my_model.layers[:25]要修改为my_model.layers[:15]，原博文此处也是错的。\n",
    "# 4，构建模型\n",
    "from keras.preprocessing.image import ImageDataGenerator\n",
    "from keras.models import Sequential\n",
    "from keras.layers import Dropout, Flatten, Dense\n",
    "from keras import applications\n",
    "from keras import optimizers\n",
    "from keras.models import Model\n",
    "def build_model2():\n",
    "    base_model = applications.VGG16(weights='imagenet', include_top=False,input_shape=(IMG_W, IMG_H,IMG_CH))\n",
    "    # 此处我们只需要卷积层不需要全连接层，故而inclue_top=False,一定要设置input_shape，否则后面会报错\n",
    "    # 这一步使用applications模块自带的VGG16函数直接加载了模型和参数，作为我们自己模型的“身子”\n",
    "    \n",
    "    # 下面定义我们自己的分类器，作为我们自己模型的“头”\n",
    "    top_model = Sequential()\n",
    "    top_model.add(Flatten(input_shape=base_model.output_shape[1:])) # 如果没有设置input_shape,这个地方报错，显示output_shape有很多None\n",
    "    top_model.add(Dense(256, activation='relu'))\n",
    "    top_model.add(Dropout(0.5))\n",
    "    top_model.add(Dense(1, activation='sigmoid')) # 二分类问题\n",
    "    \n",
    "    top_model.load_weights('E:\\PyProjects\\DataSet\\FireAI\\DeepLearning\\FireAI006/top_FC_model') \n",
    "    # 上面定义了模型结构，此处要把训练好的参数加载进来，\n",
    "    \n",
    "    my_model = Model(inputs=base_model.input, outputs=top_model(base_model.output)) # 将“身子”和“头”组装到一起\n",
    "    # my_model就是我们组装好的完整的模型，也已经加载了各自的weights\n",
    "    \n",
    "    # 普通的模型需要对所有层的weights进行训练调整，但是此处我们只调整VGG16的后面几个卷积层，所以前面的卷积层要冻结起来\n",
    "    for layer in my_model.layers[:15]: # 15层之前都是不需训练的，原博文此处也是错的。我晕。。。。\n",
    "        layer.trainable = False\n",
    "        \n",
    "    # 模型的配置\n",
    "    my_model.compile(loss='binary_crossentropy',\n",
    "                  optimizer=optimizers.SGD(lr=1e-4, momentum=0.9), # 使用一个非常小的lr来微调\n",
    "                  metrics=['accuracy'])\n",
    "    return my_model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "start to train model2\n",
      "Epoch 1/20\n",
      "125/125 [==============================] - 727s 6s/step - loss: 0.3288 - acc: 0.8865 - val_loss: 0.2991 - val_acc: 0.9113\n",
      "Epoch 2/20\n",
      "125/125 [==============================] - 732s 6s/step - loss: 0.1822 - acc: 0.9395 - val_loss: 0.2988 - val_acc: 0.9113\n",
      "Epoch 3/20\n",
      "125/125 [==============================] - 724s 6s/step - loss: 0.1557 - acc: 0.9445 - val_loss: 0.2742 - val_acc: 0.9125\n",
      "Epoch 4/20\n",
      "125/125 [==============================] - 726s 6s/step - loss: 0.1206 - acc: 0.9550 - val_loss: 0.3038 - val_acc: 0.9200\n",
      "Epoch 5/20\n",
      "125/125 [==============================] - 731s 6s/step - loss: 0.0977 - acc: 0.9685 - val_loss: 0.2691 - val_acc: 0.9225\n",
      "Epoch 6/20\n",
      "125/125 [==============================] - 715s 6s/step - loss: 0.0738 - acc: 0.9745 - val_loss: 0.3476 - val_acc: 0.9113\n",
      "Epoch 7/20\n",
      "125/125 [==============================] - 711s 6s/step - loss: 0.0916 - acc: 0.9690 - val_loss: 0.2683 - val_acc: 0.9263\n",
      "Epoch 8/20\n",
      "125/125 [==============================] - 731s 6s/step - loss: 0.0685 - acc: 0.9735 - val_loss: 0.2951 - val_acc: 0.9237\n",
      "Epoch 9/20\n",
      "125/125 [==============================] - 711s 6s/step - loss: 0.0569 - acc: 0.9850 - val_loss: 0.3019 - val_acc: 0.9287\n",
      "Epoch 10/20\n",
      "125/125 [==============================] - 719s 6s/step - loss: 0.0479 - acc: 0.9825 - val_loss: 0.2878 - val_acc: 0.9237\n",
      "Epoch 11/20\n",
      "125/125 [==============================] - 723s 6s/step - loss: 0.0481 - acc: 0.9815 - val_loss: 0.3174 - val_acc: 0.9287\n",
      "Epoch 12/20\n",
      "125/125 [==============================] - 729s 6s/step - loss: 0.0330 - acc: 0.9905 - val_loss: 0.3103 - val_acc: 0.9300\n",
      "Epoch 13/20\n",
      "125/125 [==============================] - 717s 6s/step - loss: 0.0432 - acc: 0.9875 - val_loss: 0.2846 - val_acc: 0.9387\n",
      "Epoch 14/20\n",
      "125/125 [==============================] - 708s 6s/step - loss: 0.0259 - acc: 0.9895 - val_loss: 0.3355 - val_acc: 0.9363\n",
      "Epoch 15/20\n",
      "125/125 [==============================] - 708s 6s/step - loss: 0.0253 - acc: 0.9915 - val_loss: 0.2992 - val_acc: 0.9313\n",
      "Epoch 16/20\n",
      "125/125 [==============================] - 709s 6s/step - loss: 0.0286 - acc: 0.9895 - val_loss: 0.2601 - val_acc: 0.9325\n",
      "Epoch 17/20\n",
      "125/125 [==============================] - 721s 6s/step - loss: 0.0226 - acc: 0.9940 - val_loss: 0.3419 - val_acc: 0.9250\n",
      "Epoch 18/20\n",
      "125/125 [==============================] - 703s 6s/step - loss: 0.0260 - acc: 0.9905 - val_loss: 0.3304 - val_acc: 0.9313\n",
      "Epoch 19/20\n",
      "125/125 [==============================] - 704s 6s/step - loss: 0.0138 - acc: 0.9955 - val_loss: 0.3267 - val_acc: 0.9413\n",
      "Epoch 20/20\n",
      "125/125 [==============================] - 705s 6s/step - loss: 0.0103 - acc: 0.9960 - val_loss: 0.3551 - val_acc: 0.9325\n"
     ]
    }
   ],
   "source": [
    "# 开始用train set来微调模型的参数\n",
    "print('start to train model2')\n",
    "my_model2=build_model2()\n",
    "history_ft2 = my_model2.fit_generator(\n",
    "        train_generator,\n",
    "        steps_per_epoch=train_samples_num // batch_size,\n",
    "        epochs=epochs,\n",
    "        validation_data=val_generator,\n",
    "        validation_steps=val_samples_num // batch_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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aonIdyLysV9N5axtk281vCoki6wFgf374bnnoEMHOOOMqHfvlIAjzzl8GLp3hzlz4KmnTBns2ZNzmw8/hLvusqmg+++PmighrWpX1XGqehpWf9mXFfdXoLqqNsHqIE/3io5nbZt8q+HnzIGqVWHz5uDHOmLPyy+bUr7rrph075SAI0/xTenMnWsW7qRJ8P77cP75FuETiI0bTWmccQZMnQqFonfVhruq/VWgM4CqHlTVdO/9UmA9UDdqksWTxYtNUy9bFm9JHEeOwJNPQpMmFvkQA5wScOQpw4fD5Mn296ab4B//gHffhXXr4Jxz4Pvvjz1+3z7o0sUCImbOhDJloirON8DpIlJLRIpiZSln+R8gIqf7fbwSWOttP8lzLCMitbFU6huiKl28WOG5RFaujK8cDnjvPfs/3HUXSCDDNfc4JeDIFVu22Ej+8OHgx44fD488AjfeaPP6Pi6/HD77zKyENm2sP7DP/fubYnjlFTj99IDdRoyqZgCDsXQmK4EZqvqTiIzwIoEABovITyKyDJv26ettPx/4XkSWA28AA/PNinjfw98pgcjYvBnOOw8WLMh9X2PG2NRct2657ys7VDWhXk2bNlVH4rN5s+qgQapFi6qCau3aqi+8oHroUODj33xTVUS1QwfVw4ez77NRI9WUFOvr8cet78cfj67swBJ113ZgDh60fwCotmwZb2mSkylT7PcrXFj15Zcj72fZsrBugEiva2cJFBB274aRIy3cODf88gvcfDOcdhpMnAh9+8L06XDiiTbCr1sXnn8eDh062ubTT6FXL2jZEl57DQpnE5hcrZode8kl1tfQodCjB/zrX7mT2REGa9fa3FvFimYJqIuIDZtVq6BIETNre/eG0aMj62fMGChVCgYMiK58WYlEc8TylRSjpSTk/vttUHHyyaoLF4bfftMm1ZtuUi1SxF433WTbfBw5ovruu6otWth5qldXnTBB9dtvVcuVUz3jDNUdO0I716FDqrfconrZZap794YvazBwlkD2zJhh/8D+/e3vli3xlii2rFypmpER3T47d1Zt0ED1wAHVbt3sd7zzTtXMzND72LLFbrRbbgm5SaTXddwf+llfSXGjJBn79qlWqKB67rmq9erZtMzw4aFd+xs2qP7jH2bZFimiOnCg6s8/Z3/8kSOq8+apnnOOXV0+xbNxY9S+Tq5xSiAHHnrI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z40a2cKxN94IvH/fPgs9TVanMC6LaMQ8+6wFQXTpYqVJw2H/fqsdcM01Ng3gcEAIqSPuustSJAwffvy+b76BxYstz06gh93119sK3C++OLpt/36bfskuXYQ/ItlHCP34oz1ob73VcpeES/Hi8M47Fk2UU56gcBkyxG6wnTsjmwoC+95du9q6jUARVr46C8m6RgCnBCJi7Vpbjd+mjUXvXXedpToJlZdespWhboGYwx9f6ohsKVfOHmyzZtkiMn+eecYewH37Bm579dWWbG3atKPbVq82yyDUsMnslMDjj1tYZm4e4L78P9FMu1C5MgwcaO8vvDDyfq65xkJZZ806fl8SJ47z4ZRAmGRmwg032ADjtdfguefMb/TII6G1X7DABkwXXhi4uJGj4FKpki3wzTFP2223mePz/vuPbtu2zZygN9xg+XMCUaaMma2vvWYjFwieOC4r9evbufxHxBs22LkHDrTpoETjkUdsxXQ46Xmz0qyZlYwMNCW0erVZXnXqRN5/nHFKIEyefho+/9wGXqecYoEX119vWWw/+STntt9+awOyBg1sOsgVfnH4U6mSDczT03M4qHRpGDYM3n//6AU3aZKFmw0enPMJ+vSx9Mi+gikrVtgDLNTMl4EihJ54wi7kO+8MrY+8pmRJS1ORG0Tsxn3/fSsE7s+qVVCzpk1pJSlOCYTBqlVW0rFTJ5sC8jFunPmOevXK/gbesMGcwCeeaAOTsmXzRmZH8hBywfl//tPCRu+7z8JCx4+3B12wh/nFF1u7qVPt88qVduGG6pjKqgR++81y/vftayOi/EzXrvZbZ604lsw5gzycEgiRjAyr2FWypIVi+4cElyljFvH27WaRZw3A2L4dLr/c+pg/P//fL47ICFkJlChxNDTtn/+0EouhzMenpNjoZe5cSEs7WlIyVGrWNIXhUwJPPmkWyL/+FXofyUrr1qZA/aeEjhwxx7BTAgWD0aOtpOO4cRYtl5WzzzbLePZsixzysXcvdOhg6VnmzEn668URQypXtr85Ood99O9vuccnT7b56FCnPPr0sdHItGn2AAsnl05KioVCrlxp00rjx0P37kk9Hx4yhQqZT2XePAsLBcuQun9/0t/UTgmEwE8/WVRe166W8yo7br3VHvhDhli508OH7R5ZutQshVat8k5mR/IRsiUANiL3hYoOHhx6DHzDhvC3v1mh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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_training(history_ft2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
